package icu.funkye.confine.limiter.product;

import java.util.concurrent.TimeUnit;

/**
 * @author jianbin.chen
 */
public interface Limiter {

    /**
     * @param resource 资源名
     * @param tps 阈值
     * @return
     */
    Limiter create(String resource, int tps);

    /**
     * @param resource 资源名
     * @param tps 阈值
     * @param seconds 速率
     * @return
     */
    Limiter create(String resource, int tps, long seconds);

    /**
     * 更新tps阈值
     * @param tps 阈值
     * @return
     */
    Limiter setTps(int tps);

    /**
     * 获取当前tps阈值
     * @return
     */
    int getTps();

    /**
     * 内部可用令牌桶，漏桶，滑动窗口等实现判断此次请求是否通过
     * @param permits 请求量，比如令牌，每次进入可以算1次
     * @param timeout 等待时长
     * @param unit 单位
     * @return
     */
    boolean tryAcquire(int permits, long timeout, TimeUnit unit);

    /**
     *
     * @param permits 请求量，默认1
     * @return
     */
    boolean tryAcquire(int permits);

    /**
     * 尝试是否能通过此次请求
     * @return
     */
    boolean tryAcquire();

    /**
     * 是否启用
     */
    boolean isEnable();

    /**
     * 更改状态
     */
    void setEnable(boolean enable) ;

}
